package com.arpa.wms.service;

import com.arpa.wms.domain.dto.InventoryOperationDto;
import com.arpa.wms.domain.dto.OutboundItemDTO;
import com.arpa.wms.domain.entity.OutboundItem;
import com.arpa.wms.domain.vo.OutboundItemVO;
import com.arpa.wms.domain.vo.OutboundItemWithRegisterVO;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 出库单明细 服务类
 * </p>
 *
 * @author LEO
 * @since 2020-08-07
 */
public interface IOutboundItemService extends IService<OutboundItem> {

    /**
     * 保存
     * @param entity
     * @return
     */
    @Override
    boolean save(OutboundItem entity);

    /**
     * 根据code更新实体
     * @param entity
     * @return
     */
    int updateByCode(OutboundItem entity);

    /**
     * 查询列表
     * @param outboundItemDTO
     * @return
     */
    List<OutboundItemVO> queryList(OutboundItemDTO outboundItemDTO);

    /**
     * 查询合计,包含总数
     * @param outboundItemDTO
     * @return
     */
    OutboundItemVO queryListSum(OutboundItemDTO outboundItemDTO);

    /**
     * 查询所有
     * @param outboundItemDTO
     * @return
     */
    List<OutboundItemVO> queryAll(OutboundItemDTO outboundItemDTO);

    /**
     * @description
     * 关联确认单查询结果集
     * @author xuyang
     * @date 2020/10/27 14:50
     * @param outboundItemDTO:
     **/
    List<OutboundItemWithRegisterVO> queryItemWithRegisterList(OutboundItemDTO outboundItemDTO);

    /**
     * @description
     * 根据拣货量与复核量+退减量的比较，尝试更新明细的状态
     * @author xuyang
     * @date 2020/10/29 8:55
     * @param itemCode:
     * @param status:
     **/
    int updateStatusIfFinishRecheck(String itemCode, String status);

    /**
     * @description
     * 尝试更新明细中的缺货数量，如果计划数量 < 已复核数量+已维护缺货数量+新缺货数量，则不更新
     * @author xuyang
     * @date 2020/10/29 10:24
     * @param outboundItemCode:
     * @param stockoutQuantity:
     **/
    int updateStockout(String outboundItemCode, BigDecimal stockoutQuantity);

    /**
     * 根据分配单出库数量更新出库明细的出库数量
     * @param code
     * @param wavePickingCode
     * @return
     */
    int updateOutQuantityByDistribution(String code, String wavePickingCode);

    /**
     * 根据出库登记表的复核数量更新出库明细复核数量和状态
     * @author rfwang
     * @date 2021/5/21 12:13
     * @param outboundCode 出库单号
     */
    int updateRecheckQuantity(String outboundCode,String groupCode);

    /**
     * 订单取消更新出库明细数量
     * @author liuxr
     * @date 2021/5/21 21:23
     * @param wavePickingCode
     * @param allQuantityList
     */
    void deliveryCancelUpdataQuantity(String wavePickingCode, List<InventoryOperationDto> allQuantityList);

    /**
     * 根据波次号和状态查询列表
     * @param outboundItemDTO
     * @return
     */
    List<OutboundItemVO> queryListGroupByWavePickingCodeAndStatus(OutboundItemDTO outboundItemDTO);


    /**
     * 根据出库登记表的复核数量更新出库明细复核数量和状态
     * @author rfwang
     * @date 2021年7月16日
     * @param wavePickingCode 波次号
     */
    int updateRecheckQuantityByWavePickingCode(String wavePickingCode);

}
